package models;

import java.util.*;

import javax.persistence.*;

import play.db.ebean.*;
import play.db.ebean.Model.Finder;
import play.data.format.*;
import play.data.validation.*;
import com.avaje.ebean.*;

@Entity
public class Question extends Model {
	@Id
	private Long idQuestion;
	private NiveauQuestion niveauQuestion;
	private Chapitre chapitre;

	private List<Choix> listeChoix;

	@Constraints.Required
	private String libelleQuestion;
	private String commentaire;

	public static Finder<Long, Question> find = new Finder<Long, Question>(
			Long.class, Question.class);

	/**
	 * La méthode permet de retrouver une question à partir de son ID
	 * 
	 * @param id
	 * @return Qcm
	 */
	public static Question findById(Long id) {
		return Ebean.find(Question.class, id);
	}

	/**
	 * Retourne la liste des questions pour un theme
	 * 
	 * @param idTheme
	 * @return liste des questions associées a un theme
	 */
	public static List<Question> findFromTheme(Long idTheme) {
		Collection<Matiere> lMatieres = new ArrayList<Matiere>();
		Collection<Chapitre> lChapitres = new ArrayList<Chapitre>();
		Collection<Question> lQuestions = new ArrayList<Question>();

		lMatieres = Theme.find.byId(idTheme).getSesMatieres();

		for (Matiere matiere : lMatieres) {
			lChapitres.addAll(matiere.getSesChapitres());
		}

		for (Chapitre chapitre : lChapitres) {
			lQuestions.addAll(chapitre.getSesQuestions());
		}

		return (List<Question>) lQuestions;
	}

	/**
	 * Retourne la liste des questions pour une matiere
	 * 
	 * @param idMatiere
	 * @return liste des questions associées a une matiere
	 */
	public static List<Question> findFromMatiere(Long idMatiere) {
		Collection<Chapitre> lChapitres = new ArrayList<Chapitre>();
		Collection<Question> lQuestions = new ArrayList<Question>();

		lChapitres = Matiere.find.byId(idMatiere).getSesChapitres();

		for (Chapitre chapitre : lChapitres) {
			lQuestions.addAll(chapitre.getSesQuestions());
		}

		return (List<Question>) lQuestions;
	}

	/**
	 * Retourne la liste des questions pour un chapitre
	 * 
	 * @param idChapitre
	 * @return liste des questions associées a un chapitre
	 */
	public static List<Question> findFromChapitre(Long idChapitre) {
		return (List<Question>) Chapitre.find.byId(idChapitre)
				.getSesQuestions();
	}

	/*
	 * GETTER ET SETTER
	 */
	public Long getIdQuestion() {
		return idQuestion;
	}

	public void setIdQuestion(Long idQuestion) {
		this.idQuestion = idQuestion;
	}

	@ManyToOne
	public NiveauQuestion getNiveauQuestion() {
		return niveauQuestion;
	}

	public void setNiveauQuestion(NiveauQuestion niveauQuestion) {
		this.niveauQuestion = niveauQuestion;
	}

	@ManyToOne
	public Chapitre getChapitre() {
		return chapitre;
	}

	public void setChapitre(Chapitre chapitre) {
		this.chapitre = chapitre;
	}

	public String getLibelleQuestion() {
		return libelleQuestion;
	}

	public void setLibelleQuestion(String libelleQuestion) {
		this.libelleQuestion = libelleQuestion;
	}

	public String getCommentaire() {
		return commentaire;
	}

	public void setCommentaire(String commentaire) {
		this.commentaire = commentaire;
	}

	@OneToMany(mappedBy = "question")
	public List<Choix> getListeChoix() {
		return listeChoix;
	}

	public void setListeChoix(List<Choix> listeChoix) {
		this.listeChoix = listeChoix;
	}

}
